/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package redes;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.StringTokenizer;

import networkproject.Layer;
import enlace.Enlace;

/**
 *
 * @author ivethy
 */
public class EstadoGateway extends Estado{
    HashMap<Byte, Byte> maquinas = new HashMap<Byte, Byte>();
    protected LinkedList<Enlace> enlaces;

    public EstadoGateway(Enlace layerDown, Layer layerUp, BufferedReader leitor) throws IOException {
        super(layerDown, layerUp);
        enlaces = new LinkedList<Enlace>();
        
        StringTokenizer token = new StringTokenizer(leitor.readLine());
        eu = new byte[3];
        eu[0] = Byte.parseByte(token.nextToken()); // endereco 1
        eu[1] = Byte.parseByte(token.nextToken()); // endereco 2
        eu[2] = Byte.parseByte(token.nextToken()); // mac
        this.mac = eu[1];
        for (int i = 0; i < 2; i++) {
            token = new StringTokenizer(leitor.readLine());
            maquinas.put(Byte.parseByte(token.nextToken()), Byte.parseByte(token.nextToken()));
        }
        leitor.close();
    }

    public void recebe(ArrayDeque<Byte> lista) {
        LinkedList<Byte> aux = new LinkedList<Byte>(lista);
        // A informacao do ip de destino no cabecalho deve estar na posica 2(ou seja antes vem origem depois destino)
        byte IPDestino = aux.get(1);
        
        if (IPDestino == eu[0] || IPDestino == eu[1]) {

            lista.removeFirst();
            lista.removeFirst();
            
            camadaCima.receive(lista);
        } else {
            try {
            	System.out.println("Gateway nao envia");
            	// Repassando pra enlace
                //camadaBaixo.envia(lista, maquinas.get(IPDestino));
                System.out.println("Msg de "+eu[0]+","+eu[2] +" para "+IPDestino+ ","+ maquinas.get(IPDestino));
            } catch (Exception e){
                System.err.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+aux);                
            }
        }
    }

    public void envia(ArrayDeque<Byte> lista, Byte destiny) {
    	byte macDestino = 0;
    	try {
    		BufferedReader br = new BufferedReader(new FileReader("C:\\"+destiny.byteValue()+".txt"));
    		br.readLine();
    		StringTokenizer token = new StringTokenizer(br.readLine());
    		token.nextToken();
    		macDestino = Byte.parseByte(token.nextToken());
    		br.close();
    	} catch (FileNotFoundException  fnfe) {
    		fnfe.printStackTrace();
    		System.exit(1);
    	}
    	catch(IOException ioe) {
    		ioe.printStackTrace();
    		System.exit(1);
    	}
    	LinkedList<Byte> aux = new LinkedList<Byte>(lista);
    	if (aux.get(1) == HOST_1) {
    		System.out.println("enviando para 12");
    		enlaces.get(1).send(lista, macDestino);
    	}
    	else if (aux.get(1) == HOST_2) {
    		System.out.println("enviando para 22");
    		enlaces.get(0).send(lista, macDestino);
    	} else {
    		System.out.println("Atencao, destino inexistente!");
    	}
    	System.out.println("msg para "+maquinas.get(destiny));
    	System.out.println("Msg de "+eu[0]+","+eu[1] +" para "+destiny+ ","+ maquinas.get(destiny)+ " = "+ lista);
    }
}
